package logica;

import java.util.Collection;
import mapa.Coordenada;
import unidades.UnidadHT;

/**
 *
 * @author Hasier
 */
public class AccionRangoAtaque implements Accion {

    /**
     * Muestra el rango de ataque de la unidad. Su ejecucion devolvera Collection<Coordenada> 
     * con el rango de ataque
     */
    public AccionRangoAtaque() {
    }

    /**
     * Calcula y devuelve Collection<Coordenada> con el rango de ataque
     * 
     * @param args Array con los argumentos necesarios. 
     * Debe recibir los parámetros en el siguiente orden:
     * <ol><li>ModeloHT</li>
     * <li>UnidadHT</li>
     * <li>Collection<Coordenada> rangoMovimiento</li>
     * <li>Collection<Coordenada> rangoAtaque</li>
     * <li>Coordenada</li></ol>
     * @return Collection<Coordenada> con el rango de ataque
     */
    public Object ejecutarAccion(Object... args) {
        ModeloHT modelo = (ModeloHT) args[0];
        UnidadHT unidadActual = (UnidadHT) args[1];
        Collection<Coordenada> rangoAtqActual = (Collection<Coordenada>) args[3];
        if(!rangoAtqActual.isEmpty()) {
            throw new IllegalStateException("No se pueden mostrar dos rangos de ataque "
                    + "a la vez");
        }
        if (!unidadActual.puedeAtacar()) {
            throw new IllegalStateException("La unidad actual no puede mostrar el rango de movimiento"
                    + " porque ya ha realizado otra acción y no va a poder mover");
        }
        rangoAtqActual.addAll(unidadActual.getAreaAtaque(modelo.getPartida().getMapa()));
        return rangoAtqActual;
    }
}
